#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>

int main(int argc, char** argv) {
    int rank, size;
    int send_data, recv_data;
    MPI_Status status;
    
    // 初始化 MPI 环境
    MPI_Init(&argc, &argv);
    
    // 获取当前进程的排名和总进程数
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    
    // 检查至少需要2个进程
    if (size < 2) {
        if (rank == 0) {
            printf("这个程序需要至少2个进程\n");
        }
        MPI_Finalize();
        return 0;
    }
    
    // 设置发送数据
    send_data = rank * 10;
    
    // 确定目标进程和源进程
    int dest = (rank + 1) % size;
    int source = (rank - 1 + size) % size;
    
    // 打印发送前的信息
    printf("进程 %d: 准备发送数据 %d 到进程 %d, 并从进程 %d 接收数据\n", 
           rank, send_data, dest, source);
    
    // 使用 MPI_Sendrecv 进行通信
    MPI_Sendrecv(&send_data, 1, MPI_INT, dest, 0,
                 &recv_data, 1, MPI_INT, source, 0,
                 MPI_COMM_WORLD, &status);
    
    // 打印接收到的信息
    printf("进程 %d: 接收到来自进程 %d 的数据 %d\n", 
           rank, status.MPI_SOURCE, recv_data);
    
    // 最终化 MPI 环境
    MPI_Finalize();
    
    return 0;
}